#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<fcntl.h>
#include<stdlib.h>
#define FILENAME "myfifo"

//服务器创建一个命名管道，
//并且接受客户端发来的消息

// int main()
// {
//     //open the fifo
//     if(mkfifo(FILENAME, 0666) < 0){
//         perror("myfifo error\n");
//         return -1;
//     }

//     //open the file
//     int fd = open(FILENAME, O_RDONLY);
//     if(fd < 0){
//         perror("open fail!\n");
//         return -1;
//     }

//     char msg[128];
//     // 从管道中读到msg里
//     while(1){
//         msg[0] = 0;
//         ssize_t s = read(fd, msg, sizeof(msg)-1);
//         if(s > 0){
//             msg[s] = 0;
//             printf("client sayy: %s\n", msg);
//         }
//         else if(s == 0){
//             printf("client end!\n");
//             break;
//         }
//         else{
//             perror("read error!\n");
//             exit(-1);
//         }
//     }

//     close(fd);
//     return 0;
// }

//命名管道实现进程遥控
int main()
{
    if(mkfifo(FILENAME, 0666) < 0){
        perror("mkfifo error!\n");
        return -1;
    }

    //打开文件
    int fd = open(FILENAME, O_RDONLY);
    if(fd < 0){
        perror("open fail!\n");
        return 1;
    }

    char msg[128];
    while(1)
    {
        msg[0] = 0;
    ssize_t s = read(fd, msg, sizeof(msg) - 1);

        if(s > 0){
            msg[s] = 0;
        printf("client say: %s\n", msg);
        if(fork() == 0){
            execlp(msg, msg, NULL);
            exit(1);
        }
        waitpid(-1, NULL, 0);
        }
        else if(s == 0){
        printf("client end!\n");
        break;
        }
        else{
        perror("read error!\n");
        exit(-1);
        }
    }
    close(fd);
    return 0;
}